package ex405.util;

import java.lang.reflect.Array;
import java.util.Arrays;

public class ArrayUtil {
    /**
     * 生成指定数组的副本，其中包括原数组中所有不重复的非null元素.
     *
     * @param array 指定被复制的数组
     * @param <E>   数组元素泛型
     * @return 由原数组中所有不重复的非null元素构成的数组副本
     */
    public static <E> E[] removeDuplicates(E[] array) {
        int size = 0;
        // 使用反射创建符合类型要求的数组
        E[] copy = (E[]) Array.newInstance(array.getClass().getComponentType(), array.length);
        for (E element : array) {
            boolean duplicated = false;
            for (int i = 0; i < size; i++) {
                if (element == null || element.equals(copy[i])) {
                    duplicated = true;
                    break;
                }
            }
            if (!duplicated) {
                copy[size++] = element;
            }
        }
        return Arrays.copyOf(copy, size);
    }

    /**
     * 查找数组中的最大值
     *
     * @param array
     * @param <E>
     * @return
     */
    public static <E extends Comparable<E>> E max(E[] array) {
        E result = array[0];
        for (E element : array) {
            if (element.compareTo(result) > 0) {
                result = element;
            }
        }
        return result;
    }

    /**
     * 查找数组中的最小值
     *
     * @param array
     * @param <E>
     * @return
     */
    public static <E extends Comparable<E>> E min(E[] array) {
        E result = array[0];
        for (E element : array) {
            if (element.compareTo(result) < 0) {
                result = element;
            }
        }
        return result;
    }

}
